package cn.johnyu.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;

public class JwtDemo {
    public static void main(String[] args) {
        String subject1="这是加密的信息，可以是json字符串";
        //一个简单生成jwt字符串的过程
        String jwt = Jwts.builder()
                .setSubject(subject1).compact();

        //解析jwt字符串，生成Claims对象（它只是对JWT 的payload部分的封装）
        Claims claims = (Claims) Jwts.parser()
                .build().parse(jwt).getBody();
        String subject2 = claims.getSubject();
        System.out.println(jwt);
        System.out.println(subject2);
    }

    public static void main2(String[] args) {
        String subject="这是加密的信息，可以是json字符串";
        String issuer="johnyu";//发行者
        Date issueDate=new Date(System.currentTimeMillis());//发行时间
        Date expireDate=new Date(System.currentTimeMillis()+1000*60*60*24);//过期时间
        String secretKeyValue="abcdefghijklmnopqrstuvwxyz123456";//密钥值必须大于等于32
        SecretKey secretKey1 = Keys.hmacShaKeyFor(secretKeyValue.getBytes());//生成加密钥对象

        String jwt = Jwts.builder()
                .setSubject(subject)
                .setIssuer(issuer)
                .setIssuedAt(issueDate)
                .setExpiration(expireDate)
                .signWith(secretKey1)
                .compact();//生成jwt字符串

        //生成解密钥对象(根据同一个密钥值生成另外一个解密钥对象)
        SecretKey secretKey2 = Keys.hmacShaKeyFor(secretKeyValue.getBytes());
        //生成的Jws对象包含了jwt的三个部分：Header,Payload,Signature
        Jws<Claims> claimsJws = Jwts.parser()
                .setSigningKey(secretKey2)//设置解密钥
                .build().parseClaimsJws(jwt);
        Claims claims = claimsJws.getBody();//获取jwt的payload部分（共有三个部分：Heade,Payload,Signature）
        String issuer1 = claims.getIssuer();//获取发行者
        Date expiration = claims.getExpiration();//获取过期时间
        String subject1 = claims.getSubject();//获取主题
        claimsJws.getHeader();//获取头部
        claimsJws.getSignature();//获取签名部分
        System.out.printf("%s,%s,%s\n",subject1,issuer1,expiration);
    }
}
